/* Nama File : segitiga.cpp                         */
/* Deskripsi : Implementasi dari class Segitiga     */
/* Anggota Kelompok : Dekha Anggareska 13510050		*/
/*                    Fadhil Muhtadin 13510070		*/
/*                    Muhammad Iqbal 13510064		*/
/*                    Yulius Nainggolan 13510090	*/

#include "segitiga.h"
#include <iostream>
using namespace std;

	/* Empat Sekawan */
	Segitiga::Segitiga() : Bidang(3) {
	/* Konstruktor Segitiga */
	/* I.S. Segitiga belum tercipta */
	/* F.S. Segitiga tercipta */
		cout << "ctor Segitiga" << endl;
	};
	Segitiga::Segitiga(Cell Ca, Cell Cb, Cell Cc) : Bidang(3) {
	/* Konstruktor Segitiga dengan parameter */
	/* I.S. Segitiga belum tercipta */
	/* F.S. Segitiga tercipta */
		setC1(Ca);
		setC2(Cb);
		setC3(Cc);
		cout << "ctor Segitiga dengan Parameter" << endl;
   };
	Segitiga::Segitiga(const Segitiga& S1) : Bidang(S1.getSudut()) {
	/* CCtor Segitiga */
	/* I.S. Segitiga terdefinisi */
	/* F.S. Segitiga baru tercipta sebagai kopi Segitiga sebelumnya */
		setC1(S1.getC1());
		setC2(S1.getC2());
		setC3(S1.getC3());
		cout << "cctor Segitiga" << endl;
   };
	Segitiga::~Segitiga(){
	/* Destruktor Segitiga */
	/* I.S. Segitiga terdefinisi */
	/* F.S. Segitiga dimusnahkan */
		cout << "dtor Segitiga" << endl;
	};
    Segitiga& Segitiga::operator=(const Segitiga& S2) {
	/* operator assignment Segitiga */
	/* I.S. Segitiga input terdefinisi */
	/* F.S. Segitiga output sama dengan input dengan alokasi memori tersendiri */
		setSudut(S2.getSudut());
		setC1(S2.getC1());
		setC2(S2.getC2());
		setC3(S2.getC3());
		cout << "assignment Segitiga" << endl;
	};
	
	/* Getter dan Setter */
	
	Cell Segitiga::getC1() const
	/* Mengembalikan cell pertama segitiga */
	{
		return C1;
	};
    void Segitiga::setC1(Cell Ca)
	/* Mengeset cell pertama segitiga */
	/* I.S. Segitiga terdefinisi */
	/* F.S. C1 sama dengan Cell input */
	{
		C1 = Ca;
	};
	Cell Segitiga::getC2() const
	/* Mengembalikan cell kedua segitiga */
	{
		return C2;
	};
    void Segitiga::setC2(Cell Cb)
	/* Mengeset cell kedua segitiga */
	/* I.S. Segitiga terdefinisi */
	/* F.S. C2 sama dengan Cell input */
	{
		C2 = Cb;
	};
	Cell Segitiga::getC3() const
	/* Mengembalikan cell ketiga segitiga */
	{
		return C3;
	};
    void Segitiga::setC3(Cell Cc)
	/* Mengeset cell ketiga segitiga */
	/* I.S. Segitiga terdefinisi */
	/* F.S. C3 sama dengan Cell input */
	{
		C3 = Cc;
	};
	
	void Segitiga::setCorner(int i , Cell Ci) 
	/* Mengeset cell titik sudut dengan cell input, HANYA UNTUK POLYGON */
	/* I.S. Segitiga terdefinisi */
	/* F.S. Sama dengan I.S. */
	{
		cout << "error setCorner Segitiga" << endl;
	}
	
	int Segitiga::isPointInside(Cell PS) 
	/* Mengembalikan 1 bila Cell input berada dalam Segitiga, 0 bila tidak */
	{
		float nIntersect = 0;
		int nSudutUp = 0;
		int nSudutDown = 0;
		
		if (PS.getX() == 6 && PS.getY() == 5) {
			cout << "cekIntersectSegitiga---------" << PS.isBoundaryIntersect(getC1(), getC2()) << endl;
			cout << "cekIntersectSegitiga---------" << PS.isBoundaryIntersect(getC2(), getC3()) << endl;
			cout << "cekIntersectSegitiga---------" << PS.isBoundaryIntersect(getC3(), getC1()) << endl;
			
		}
		
		if (PS.isBoundaryIntersect(getC1(), getC2()) == 1) {nIntersect++;}
		else if (PS.isBoundaryIntersect(getC1(), getC2()) == 3) {nIntersect = nIntersect+0.5;}
		else if (PS.isBoundaryIntersect(getC1(), getC2()) == 5) {nIntersect = nIntersect+0.5; nSudutUp++;}
		else if (PS.isBoundaryIntersect(getC1(), getC2()) == 6) {nIntersect = nIntersect+0.5; nSudutDown++;}
		else if (PS.isBoundaryIntersect(getC1(), getC2()) == 4) {return 1;}
		else if (PS.isBoundaryIntersect(getC1(), getC2()) == 7) {return 1;}
		
		if (PS.isBoundaryIntersect(getC2(), getC3()) == 1) {nIntersect++;}
		else if (PS.isBoundaryIntersect(getC2(), getC3()) == 3) {nIntersect = nIntersect+0.5;}
		else if (PS.isBoundaryIntersect(getC2(), getC3()) == 5) {nIntersect = nIntersect+0.5; nSudutUp++;}
		else if (PS.isBoundaryIntersect(getC2(), getC3()) == 6) {nIntersect = nIntersect+0.5; nSudutDown++;}
		else if (PS.isBoundaryIntersect(getC2(), getC3()) == 4) {return 1;}
		else if (PS.isBoundaryIntersect(getC2(), getC3()) == 7) {return 1;}
		
		if (PS.isBoundaryIntersect(getC3(), getC1()) == 1) {nIntersect++;}
		else if (PS.isBoundaryIntersect(getC3(), getC1()) == 3) {nIntersect = nIntersect+0.5;}
		else if (PS.isBoundaryIntersect(getC3(), getC1()) == 5) {nIntersect = nIntersect+0.5; nSudutUp++;}
		else if (PS.isBoundaryIntersect(getC3(), getC1()) == 6) {nIntersect = nIntersect+0.5; nSudutDown++;}
		else if (PS.isBoundaryIntersect(getC3(), getC1()) == 4) {return 1;}
		else if (PS.isBoundaryIntersect(getC3(), getC1()) == 7) {return 1;}
		
		if (PS.getX() == 6 && PS.getY() == 5) {
		cout << "cekIntersectSegitiga---------" << nSudutUp << endl;
		cout << "cekIntersectSegitiga---------" << nSudutDown << endl;
		}
			
		if (((nIntersect != 0) && ((int) nIntersect % 2 != 0)) && (((nSudutUp%2 != 0) && (nSudutDown%2 != 0)) || ((nSudutUp == 0) && (nSudutDown == 0)))) {return 1;}
		else {return 0;}
	};